//**************************************************************
//檔案名稱:ASPGrid21.JS
//目    的:提供GSSCM_ASPGRID21元件所需的JavaScript函數
//
// 版本變更：
// xx.  	YYYY/MM/DD  AUTHOR    COMMENTS
// R1.02	2002/04/08	Roger Lo	修改 __grdDelRecord()
// R1.01	2002/01/04  Roger Lo	修改若干函數內的__grdASPGridInit()敘述位置
// R1.00	2001/12/27 	Roger Lo	Release
//**************************************************************

var __mstartPage=0, __mendPage=0, __mttlPages=0, __mtblName, __mpageSize=0, __mdataCount=0
var __mlastRow,__mlastRowColor, __mobjCurTR

//設定/取得起始頁
function __grdGetStartPage(){return __mstartPage;}
function __grdSetStartPage(Val){__mstartPage=Val;}
//設定/取得結束頁
function __grdGetEndPage(){return __mendPage;}
function __grdSetEndPage(Val){__mendPage=Val;}
//設定/取得總頁數
function __grdGetTtlPages(){return __mttlPages;}
function __grdSetTtlPages(Val){__mttlPages=Val;}
//設定/取得表格名
function __grdGetTblName(){return __mtblName;}
function __grdSetTblName(Val){__mtblName=Val}
//設定/取得頁大小
function __grdGetPageSize(){return __mpageSize;}
function __grdSetPageSize(Val){__mpageSize=Val;}
//設定/取得總筆數
function __grdGetDataCount(){return __mdataCount;}
function __grdSetDataCount(Val){__mdataCount=Val;}

//元件會產生 TableName + __grdInit()的函數,去設定這個表格的資料
//當滑鼠經過表格時會驅動此函數,將屬於此表格的資料設進來
//參數說明:
// sGridName:(String)TableClass的Name屬性
function __grdASPGrid_OnMouseOver(sGrdName) {
	__grdASPGridInit(sGrdName);
}

//函數名稱: __grdASPGridInit()
//功能: 設定屬於此表格的資料(如總頁數,表格名稱,...)
//備註: 
//	1. 當一個網頁內有兩個以上表格時,在呼叫任一表格的JS函數前需要先呼叫此函數,才不會將資料搞混
//	2. 在表格(套表)元件的Show()方法中的paraHasPgInfoJS參數必須設成True(預設值)
//參數說明:
// sGridName:(String)TableClass的Name屬性
function __grdASPGridInit(sGrdName) {
	try {
		if (sGrdName!=__mtblName) {
			__grdSetTblName(sGrdName);
			eval(sGrdName + '__grdInit()');
		}	
		return true;
	} catch (e) {
		return false;
		} //pass error
}


function __grdPageIndex_OnMouseOver() {
	//當滑鼠移到預設的頁碼索引項時執行此函數
	var e=event.srcElement;
	if (e.tagName!='SPAN') return;
	if (e.style.color!='red') {
		e.style.cursor='hand';
		e.style.color='blue';
	}	else {
		e.style.cursor='default';
	}
}

function __grdPageIndex_OnMouseOut() {
	//當滑鼠移出預設的頁碼索引項時執行此函數
	var e=event.srcElement;
	if (e.tagName!='SPAN') return;
	if (e.style.color!='red') {
		e.style.cursor='default';
		e.style.color='black';
	}	
}

function __grdPageIndex_OnClick() {
	//當滑鼠點到頁碼索引項時執行此函數
	//修改:
	//  2001/11/28 by Roger Lo,改用getElmentById
	var e=event.srcElement;
	if (e.tagName!='SPAN') return;
	var p=e.id.substr(__mtblName.length + 7);
	var oPgIdx;
	for (var i=__mstartPage;i<=__mendPage;i++) {
		if (i!=p) {			
			oPgIdx=document.getElementById(__mtblName + '__PgIdx' + i);
			if (oPgIdx!=null)	oPgIdx.style.color='black';
		}
		else {
			oPgIdx=document.getElementById(__mtblName + '__PgIdx' + p);
			if (oPgIdx!=null) oPgIdx.style.color='red';
			__GoToPage(p);
		}		
	}
}

//函數名稱: __grdRow_OnClick(sHiColor) 
//功能: 點選列變成指定色
//備註: 事件來源必須在表格列(TR)內,可提供TableClass的SetTRAttr()設定使用
//參數說明:
// sHiColor:(String,Optional)顏色值(預設顏色#ffe4c4)	
function __grdRow_OnClick(sHiColor,oTR) {
	try {
		var e=__grdGetParentElementByTag(event.srcElement,'TR');
		var sBC=e.style.borderCollapse;
		if (e==null) return;
		if (sHiColor==null) sHiColor='#ffe4c4';
		if (__mlastRow==null) {
			//do nothing
		}	else if (e!=__mlastRow) { 
			__mlastRow.style.backgroundColor=__mlastRowColor;
		}	else return;
		__mlastRowColor=e.style.backgroundColor;
		e.style.borderCollapse ='separate';	
		e.style.backgroundColor=sHiColor;			
		e.style.borderCollapse=sBC;
		__mlastRow=e;
		//以下是因捲軸表格時會將捲軸區塊撐大後回不來,將他調回來
		__grdAdjustBackScrollWidth(e);
	} catch(err){}	
}

//函數名稱: __grdGoToPage()
//功能: 切換到指定頁
//備註:若指定值超出頁的最大(小)值,則顯示最大(小)頁
//參數說明:
// vGoPage: (Variant)頁碼
function __grdGoToPage(vGoPage) {
	__GoToPage(vGoPage); 
}


//函數名稱: __GoToPage()
//功能: 切換到指定頁
//備註:若指定值超出頁的最大(小)值,則顯示最大(小)頁
//參數說明:
// vGoPage: (Variant)頁碼
//修改:
//	2001/11/8 by Roger Lo,使用getElementById()
function __GoToPage(vGoPage) {	
	vGoPage=parseInt(vGoPage);
	if (vGoPage<__mstartPage || vGoPage>__mendPage) return;
	//alert('vGoPage='+vGoPage+';__mstartPage='+__mstartPage+';__mendPage='+__mendPage);
	for (var i=__mstartPage;i<=__mendPage;i++) {		
//		alert(__mtblName + ',' + i);
		if (i!=vGoPage) {
			oDivP=document.getElementById(__mtblName+'__p'+i);
			oDivP.style.display='none';
			//eval('document.all.' + __mtblName + '__p' + i + '.style.display="none"');
		} else {
			oDivP=document.getElementById(__mtblName+'__p'+vGoPage);
			oDivP.style.display='';
			//eval('document.all.' + __mtblName + '__p' + vGoPage + '.style.display=""') ;
		}
	}
	__grdSetCurPage(vGoPage);
}


//函數名稱: __grdSetCurTRObject()
//功能: 設定目前列
//備註: 在Client端編輯模式的[修改]功能時,必須加以設定後,在[確定/更新]功能時,才能使用__grdModifyRecord()函數
//參數說明:	oTR:TR物件
function __grdSetCurTRObject(oTR) {
	__mobjCurTR=oTR;
}


//函數名稱: __grdGetCurTRObject()
//功能: 取得目前列
//備註: 
//傳回值:TR物件
//修改:
//	2001/12/5 by Roger Lo,新增
function __grdGetCurTRObject() {
	return __mobjCurTR;
}



function __grdGetTDColID(tdid) {
//利用TD的ID屬性取得Column ID值
//修改:2001/10/4 by Roger Lo, 避免__mtblName為null
		return tdid.substring(__mtblName.length,tdid.lastIndexOf('_'));
}


function __grdLogDelRecord(oTR) {
//在Client端編輯模式時,將使用者刪除的資料紀錄下來
//修改:
//	2001/11/8 by Roger Lo,改用getElementById()
//	2001/10/29 by Roger Lo,利用__grdWrapDataByTR()來包裹資料
//	2001/9/26 by Roger Lo,用innerHTML資料會被轉換,改回用innerText
//	2001/9/24 by Roger Lo,不考慮控制欄位, 改用innerHTML
	if (oTR.__grdFLAG=='2') return;
	var oDel=document.getElementById(__mtblName+'__grdDELDATA');	
	//var oDel=eval('document.all.' + __mtblName + '__grdDELDATA');	
	var oTB=__grdGetParentElementByTag(oTR,'TABLE');
	//var oTH=oTB.rows[0];  沒用到
	oDel.value +='<row _type="del" _key="' + __grdGetKeyValByTR(oTR) + '">'+ __grdWrapDataByTR(oTR)+'</row>\n';
	return;
}


//函數名稱:__grdGetColType
//功能: 取得目前欄位的種類(Edit,Del,Ctrl或是一般)
//回傳值: 1:一般欄位, 2:控制欄位, 3:編輯欄位, 4:刪除欄位
//參數說明:
//	oTD:TD物件
//修改:
//	2001/11/8 by Roger Lo, 改用getElementById()
//	2001/10/9 by Roger Lo, for scroll table
function __grdGetColType(oTD){
	var oTB=__grdGetParentElementByTag(oTD,'TABLE');
	if (oTB.id=='') {
		var oDiv=document.getElementById(__grdGetTblName()+'_divGrdHeader');
		//var oDiv=eval('document.all.' + __grdGetTblName() + '_divGrdHeader');
		oTB=oDiv.all.tags('TABLE')[0];
	} 
	for (var i=0;i<oTB.rows.length;i++) {
		var oTH=oTB.rows[i];
		if (oTH.__grdFLAG=='H') {
			for (var j=0;j<oTH.cells.length;j++) {
				if (oTH.cells[j].__grdCID==__grdGetColID(oTD)) {return oTH.cells[j].__grdCOLTYPE;}
			}
		}
	}
}


function __grdGetKeyValByTR(oTR) {
//利用TR的ID屬性取得KEY值(或Index值)
//參數說明:
// oTR:TR物件
	var key=oTR.id;
	var head=__mtblName+'tr_';
	return key.substring(head.length);
}


//函數名稱: __grdGetParentElementByTag()
//功能: 取得指定標籤tag的Parent物件
//備註: 
//參數說明:
// obj:原始DHTML物件
// sTag:(String)標籤名稱
function __grdGetParentElementByTag(obj,sTag) {
	while (obj.tagName!=sTag.toUpperCase()) {
		obj=obj.parentElement;
		if(obj==null) return;
	}		
	return obj
}

//函數名稱: __grdGetChildElementByTag()
//功能: 取得children中第一個合乎指定標籤tag的物件
//備註: 
//參數說明:
// obj:原始DHTML物件
// sTag:(String)標籤名稱
function __grdGetChildElementByTag(obj,sTagName) {
	sTagName=sTagName.toUpperCase();
	for (var i=0;i<obj.children.length;i++) {
		if (obj.children[i].tagName==sTagName) return obj.children[i];			
	}	
}



//函數名稱: __grdGetTDByColID()
//功能: 取得指定列TR上符合欄位名稱的TD物件
//傳回值: TD物件
//備註: 
//參數說明:
// oTR:TR物件
// sColID:欄位名稱
//修改:
//	2001/10/24 by Roger Lo,修改會造成IE5.0關閉的bug
//	2001/10/17 by Roger Lo,考慮標題,title與note
function __grdGetTDByColID(oTR,sColID,sTblName) {
	if (sTblName==null) sTblName=__grdGetTblName();
	if (oTR.__grdFLAG!='H' && oTR.__grdFLAG!='T' && oTR.__grdFLAG!='N') {
		for (var i=0;i<oTR.cells.length;i++) 
			{if (__grdGetTDColID(oTR.cells[i].id)==sColID) return oTR.cells[i];	}
	} else if (oTR.__grdFLAG=='H') {
		for (var i=0;i<oTR.cells.length;i++) 
			{if (oTR.cells[i].__grdCID==sColID) return oTR.cells[i];}
	}
	return null;	
}



//函數名稱: __grdWrapData(sColID,vValue)
//功能: 將資料包裹成XML的格式後傳回(for Client)
//備註: 
//參數說明:
//	sColID:(String)標籤名; 
//	sValue:(String)資料值; 
//	sAttr:(String,Optional)標籤屬性
function __grdWrapData(sTag,sValue,sAttr) {
	return __grdWrapXmlData(sTag,sValue,sAttr,false) 
}

//將資料包裹成XML的格式後傳回
//參數說明:
//	sColID:(String)標籤名; 
//	sValue:(String)資料值; 
//	sAttr:(String,Optional)標籤屬性
//	fXML:(Boolean,Optional)是否將sValue內的XML特殊字元取代(預設不用)
function __grdWrapXmlData(sTag,sValue,sAttr,fXML) {
	if (sAttr==null) sAttr='';
	if (fXML==null) fXML=true;
	var sTag=sTag.toLowerCase();
	if (fXML) {
		if (sAttr!='')	{	return '<' + sTag + ' ' + sAttr + '>' + __grdXMLReplace(sValue) + '</' + sTag + '>'}
		else { return '<' + sTag + '>' + __grdXMLReplace(sValue) + '</' + sTag + '>'}
	} else {
		if (sAttr!='')	{	return '<' + sTag + ' ' + sAttr + '>' + sValue + '</' + sTag + '>'}
		else { return '<' + sTag + '>' + sValue + '</' + sTag + '>'}		
	}	
}


function __grdXMLReplace(sIn) {
//將傳入值內的XML不允許字元代換掉成合法字串
//	2001/11/ by Roger Lo,mark掉驚嘆號
	var sTmp, sOut='', sReplace='';
	for (var i=0;i<sIn.length;i++) {
		sTmp=sIn.substr(i,1)
		if (sTmp=='"') sTmp='&quot;'
		else if (sTmp=='&') sTmp='&amp;'
		else if (sTmp=='<') sTmp='&lt;'
		else if (sTmp=='>') sTmp='&gt;'
		//else if (sTmp=='!') sTmp='&apos;'
		sOut+=sTmp;
	}	
	return sOut
}


function __grdXMLReplaceBack(sIn){
//將傳入值內的XML的合法字串,再還原成原始的字
//修改
//	2001/11/ by Roger Lo,mark掉驚嘆號
	var sOut=sIn;
	var sOut=__grdReplaceString(sOut,'&lt;','<');
	var sOut=__grdReplaceString(sOut,'&gt;','>');
	var sOut=__grdReplaceString(sOut,'&quot;','"');
	//var sOut=__grdReplaceString(sOut,'&apos;','!');
	var sOut=__grdReplaceString(sOut,'&amp;','&');	
	return sOut;
}

//將所有發現的字串由指定的字串替代
function __grdReplaceString(sIn,sFind,sReplace) {
	var sLeft,sRight
	var sOut=sIn;
	var iPosS=0;
	var iPosE=sOut.indexOf(sFind);	
	while (iPosE>=0) {
		sLeft=sOut.substring(iPosS,iPosE);		
		sRight=sOut.substr(iPosE+sFind.length);
		sOut=sLeft + sReplace + sRight;
		iPosE=sOut.indexOf(sFind,iPosE + sReplace.length);
	}
	return sOut;
}


//函數名稱: __grdAddNewRecord(sRecData,sTableName,iCurPage)
//功能: 在Client端編輯時,新增一筆資料
//備註: 
//參數說明:
// sRecData:(String)合乎格式的列資料; 
// sTableName:(String,Optional)表格名稱,當多表格時要指定;
// iCurPage:(Integer,Optional)當多頁時要指定
//修改:
//  2002/1/4 by Roger Lo,更改__grdASPGridInit()敘述位置
//  2001/12/4 by Roger Lo,增加__grdASPGridInit()敘述
//	2001/11/8 by Roger Lo,改用getElementById()
//	2001/10/29 by Roger Lo,考慮有註解欄時的狀況
//	2001/10/9 by Roger Lo,for scroll table
//	2001/9/26 by Roger Lo,怕資料轉錯,改用oNewTD.innerText
//	2001/9/25 by Roger Lo,加入控制欄位資料
function __grdAddNewRecord(sRecData, sTblName, pgIdx) {
	//create new row	
	if (sRecData==null) sRecData='';
	if (sTblName==null) sTblName=__grdGetTblName();
	__grdASPGridInit(sTblName);
	if (pgIdx==null) pgIdx=__grdGetStartPage();	
	var tmpTB=document.getElementById(sTblName + 'gssTbl_tmp');
	var tmpTR=tmpTB.rows[0];
	var oNewTR=tmpTR.cloneNode(true);
	var oTB=document.getElementById(sTblName+'gssTbl_'+pgIdx);
	if (oTB==null) {
		var oDiv=document.getElementById(sTblName+'_divGrdBody');
		oTB=oDiv.all.tags('TABLE')[0];
	}	
	//insert new row
	oTBD=__grdGetChildElementByTag(oTB,'TBODY');
	var oTR=oTB.rows[oTB.rows.length-1];
	if (oTR.__grdFLAG=='N') {
		oTBD.insertBefore(oNewTR,oTBD.rows[oTBD.rows.length-1]);
	} else {oTBD.insertBefore(oNewTR)}	
	//set new row data
	for (var i=0;i<oNewTR.cells.length;i++) {
		var oNewTD=oNewTR.cells[i];
		var sColID=__grdGetTDColID(oNewTD.id);		
		if (parseInt(__grdGetColType(oNewTD))==1) {oNewTD.innerText=__grdGetRecDataByColID(sRecData,sColID);}
	}	
	//set hidden value	
	oNewTR.__grdHIDDEN=__grdSetTRHidAttr(oNewTR.__grdHIDDEN,sRecData);
	oNewTR.__grdFLAG='2';
	return oNewTR;
}


function __grdSetTRHidAttr(sHidden,sRecData){
//設定隱藏欄位值(1)
	if (sHidden=='') return '';	
	var posS=1;
	var sFind='',sRet='';
	while (posS>0) {
		posS=posS + sFind.length;
		posE=sHidden.indexOf('>',posS);
		var sColID=__grdTrim(sHidden.substring(posS,posE));
		sRet += __grdWrapXmlData(sColID,__grdGetRecDataByColID(sRecData,sColID));		
		sFind='</'+sColID+'><';
		posS=sHidden.indexOf(sFind,posE+1);	
	}
	return sRet;
}


//函數名稱: __grdSetTRHiddenAttr
//功能: 設定隱藏欄位的值
//備註: 
//參數說明:
// oTR:(TR物件)指定資料列
// sColID:(String)隱藏欄位名稱
// sVal:(String)欄位值
//修改:
//	2001/11/19 by Roger Lo,允許動態新增隱藏欄位
//	2001/11/7 by Roger Lo,位置計算錯誤
//	2001/11/6 by Roger Lo,Created
function __grdSetTRHiddenAttr(oTR,sColID,sVal) {
	sColID=sColID.toLowerCase();
	var preTag='<'+sColID+'>';
	var postTag='</'+sColID+'>';
	var sHidden=oTR.__grdHIDDEN;
	var posS=sHidden.indexOf(preTag,0);	
	var sReplace=preTag+__grdXMLReplace(sVal)+postTag;
	if (posS<0) {oTR.__grdHIDDEN+=sReplace} 
	else {
		var posE=sHidden.indexOf(postTag,posS+preTag.length)+postTag.length;	
		if (posE>posS) {oTR.__grdHIDDEN=sHidden.substring(0,posS)+sReplace+sHidden.substr(posE);}	
	}
	return;
}


//同VB的Trim函數
function __grdTrim(sIn) {
	var sTmp, sOut='';
	for (var i=0;i<sIn.length;i++) {
		sTmp=sIn.substr(i,1)
		if (sTmp!=' ') {sOut+=sTmp;	}
	}	
	return sOut;
}

//函數名稱: __grdGetCurPage(sTableName)
//功能: 取得目前頁次
//備註: 
//參數說明:
//	sTableName:(String,Optional)TableClass的Name屬性,多表格時要指定
//修改
//	2001/11/8 by Roger Lo,改用getElementById
function __grdGetCurPage(sGrdName) {
	if(sGrdName==null) sGrdName=__mtblName;
	var oCurPage = document.getElementById(sGrdName+'_divGrd');
	//var oCurPage = eval('document.all.' + sGrdName + '_divGrd');
	return oCurPage._grdCurPage;
}

function __grdSetCurPage(iPgIdx,sGrdName) {
//設定目前頁次
//修改
//	2001/11/8 by Roger Lo,改用getElementById	
	if(sGrdName==null) sGrdName=__mtblName;
	var oCurPage = document.getElementById(sGrdName + '_divGrd');	
	//var oCurPage = eval('document.all.' + sGrdName + '_divGrd');	
	oCurPage._grdCurPage=iPgIdx;
}

//函數名稱: __grdModifyRecord(sRecData,sTableName,iCurPage)
//功能: 在Client端編輯時,修改指定列的資料
//備註: 在呼叫此函數前Client必須先利用__grdSetCurTRObject函數設定目前列
//參數說明:
//  sRecData:(String)合乎格式的列資料
//  sTableName:(String,Optional)TableClass的Name屬性,多表格時要指定
//  iCurPage:(Integer,Optional)所在頁碼,多頁時要指定
//傳回值:
//	TR物件
//修改:
//  2002/1/4 by Roger Lo,更改__grdASPGridInit()敘述位置
//  2001/12/24 by Roger Lo,傳回正在修改的TR物件
//  2001/12/4 by Roger Lo,增加__grdASPGridInit()敘述
//	2001/10/9 by Roger Lo,for scroll table
//	2001/9/26 by Roger Lo,怕資料亂轉,使用innerText
//	2001/9/25 by Roger Lo,考慮控制欄位
function __grdModifyRecord(sRecData,sGrdName,iPgIdx) {
	if (sGrdName==null) sGrdName=__mtblName;	
	__grdASPGridInit(sGrdName);
	if (iPgIdx==null) iPgIdx=__grdGetCurPage();		
	var oTR=__mobjCurTR;
	for (var i=0;i<oTR.cells.length;i++) {
		var oTD=oTR.cells[i]
		var sColID=__grdGetTDColID(oTD.id);
		var sData=__grdGetRecDataByColID(sRecData,sColID);
		if (parseInt(__grdGetColType(oTD))==1) {oTD.innerText=sData;}
	}			
	// modify hidden data	
	oTR.__grdHIDDEN=__grdSetTRHidAttr(oTR.__grdHIDDEN,sRecData);
	if (oTR.__grdFLAG!='2')	{oTR.__grdFLAG='1'}
	return oTR;
}


function __grdDelete_OnClick() {
//在Client端編輯時,刪除點選列
//備註:
//  使用TableClass的AddDeleteField()產生的刪除欄預設會呼叫此函數
  if (confirm('確定是否執行刪除作業?')) {
    var e=event.srcElement;    
    var oTR =__grdGetParentElementByTag(e,'TR');
    __grdDelRecord(oTR);
  }
}

//在Client端編輯時,刪除點選列
//參數說明:
// oTR: TR物件
//修改:
//	1.2002/04/08 by Roger Lo,根據傳入的TR可以判斷目前的TableName
function __grdDelRecord(oTR) {
  var oTB=__grdGetParentElementByTag(oTR,'TABLE');
  var sTbId=oTB.id;
  var idx=-1;
  if (sTbId!=''){
	  idx=sTbId.indexOf('gssTbl_');
	  if (idx>0) {__mtblName=sTbId.substring(0,idx);} 
	  else {__mtblName=''}
	} else {
		var oDIV=__grdGetParentElementByTag(oTB,'DIV');
		idx=oDIV.id.indexOf('_divGrdBody');
	  if (idx>0) {__mtblName=oDIV.id.substring(0,idx);} 
	  else {__mtblName=''}
	}	
  __grdLogDelRecord(oTR);
  oTR.removeNode(true);	
	//當刪除的資料不是點到的資料時,捲軸欄位會變掉
	__grdAdjustBackScrollWidth(oTB);
}



function __grdAdjustBackScrollWidth(e) {
//將表格捲軸區塊的寬度調整回來
//參數說明:
// e: 捲軸區塊DIV內的子元件
	try {
		var oDivB=__grdGetParentElementByTag(e,'DIV');
		var sOF=oDivB.style.overflow;
		oDivB.style.overflow='hidden';
		oDivB.style.overflow=sOF;
	} catch(err) {;}	
}


function __grdGetRecDataByColID(sRecData,sColID) {	
//取得指定欄位的資料
//參數說明:
//	sRecData:(String)合乎格式的資料
//	sColID:(String)欄位名稱
	sColID=sColID.toLowerCase();
	var posE=0;
	var posS=sRecData.indexOf('<' + sColID + '>');
	if (posS<0) posS=sRecData.indexOf('<' + sColID + ' ');	
	if (posS >= 0) {
		posS=sRecData.indexOf('>',posS+sColID.length)+1;
		posE=sRecData.indexOf("</" + sColID + ">",posS);
		if (posE >= posS) {
			return sRecData.substring(posS,posE);
		} else return '';	
	}	else return '';
}

//函數名稱: __grdGetTRAttribute()
//功能: 取得TR內指定欄位的資料(包含隱藏欄位)
//備註: 
//參數說明:
//	oTR:(TR物件)
//	sColID:(String)指定欄位名
//	sGrdName:(String,Optional)TableClass的Name屬性(多表格時要指定)
//	bAsText:(Boolean),true(Default)-傳回TD的innerText,false-傳回TD的innerHTML
//修改:
//	2001/12/25 by Roger Lo,判斷TD內的children皆為BR時,則傳回innerText
//	2001/11/2 by Roger Lo,若值有&nbsp;的改傳回空字串
//	2001/9/26 by Roger Lo,增加參數,決定傳回innerHTML或是innerText
//	2001/9/25	by Roger Lo,傳回innerHTML <== 資料會被改掉
function __grdGetTRAttribute(oTR,sColID,sGrdName,bAsText) {			
	if (sGrdName==null) sGrdName=__mtblName;
	var sGrdColID=sGrdName+sColID+'_';
	var oCol=oTR.cells;
	for (var i=0;i<oCol.length;i++) {
		var oTD=oCol[i];
		var sTDID=oTD.id;
		var pos=sTDID.indexOf(sGrdColID);
		if (pos>=0) {
			if (sTDID.indexOf('_',sGrdColID.length+1)<0) {
				if (bAsText==null) { bAsText=true }
				if (bAsText) {
					return __grdReplaceString(oTD.innerText,'&nbsp;','');
				} else if (__grdIsTextAreaData(oTD)) {
					return __grdReplaceString(oTD.innerText,'&nbsp;','');
				} else {					
					return __grdReplaceString(oTD.innerHTML,'&nbsp;','');
				}
			}
		}	
	}	
	if (oTR.__grdHIDDEN!='') {		//get hidden data
		return __grdXMLReplaceBack(__grdGetRecDataByColID(oTR.__grdHIDDEN,sColID));
	}	
}

function __grdIsTextAreaData(oTD) {
//判斷資料是否為單存的多行的文字(從TEXTAREA來的資料)
	var colElm=oTD.children;
	for (var j=0;j<colElm.length;j++) {
		if (colElm[j].tagName!='BR') {return false};
	}
	return true;
}


function __grdWrapDataByTR(oTR) {
//將傳入TR內的欄位資料(含隱藏欄位),包裹成合乎XML格式的資料傳回
//參數說明:
//	oTR:(TR物件)
//修改:
//	2001/10/16 by Roger Lo,避免處理Title與標題列
//	2001/10/12 by Roger Lo,一律將TD內的innerHTML作為欄位資料
//	2001/9/26 by Roger Lo,用ColType來辨識一般欄位與控制欄位
	var sData='';
	for (var i=0;i<oTR.cells.length;i++) {		
		if (oTR.__grdFLAG!='H' && oTR.__grdFLAG!='T' && oTR.__grdFLAG!='N') {
			var oTD=oTR.cells[i];
			var sColID=__grdGetTDColID(oTD.id);						
			sData+=__grdWrapXmlData(sColID,__grdGetTRAttribute(oTR,sColID,__grdGetTblName(),false));
		}
	}
	//append hidden data
	sData += oTR.__grdHIDDEN;
	return sData;
}

//函數名稱: __grdGetNextTR()
//功能: 取得同一表格中相鄰的下一個TR物件
//備註: 只能在同一頁
//參數說明:
//	oTR:TR物件
//	2001/10/17 by Roger Lo,避開Note
function __grdGetNextTR(oTR) {
	var iRow=oTR.sectionRowIndex+1;
	var oTB=__grdGetParentElementByTag(oTR,'TABLE');
	if (iRow<oTB.rows.length) {
		if (oTB.rows[iRow].__grdFLAG!='N' && oTB.rows[iRow].__grdFLAG!='H' && oTB.rows[iRow].__grdFLAG!='T') return oTB.rows[iRow];
	} else return null;
}


//函數名稱: __grdGetPrevTR()
//功能: 取得同一表格中相鄰的上一個TR物件
//備註: 只能在同一頁
//參數說明:
//	oTR:TR物件
//修改
//	2001/10/17 by Roger Lo,避開Title
function __grdGetPrevTR(oTR) {
	var iRow=oTR.sectionRowIndex-1;
	var oTB=__grdGetParentElementByTag(oTR,'TABLE');
	if (iRow>0) {	
		if (oTB.rows[iRow].__grdFLAG!='H' && 
			oTB.rows[iRow].__grdFLAG!='T' && 
			oTB.rows[iRow].__grdFLAG!='N') {return oTB.rows[iRow]}
		else return null;
	} else return null;
}

//函數名稱: __grdGetFirstTR()
//功能: 取得某頁表格的第一筆TR
//備註: 
//參數說明:
//	iPgIdx:(integer)頁次
//	sTblName:(String,Optional)TableClass的Name屬性,多表格時要指定
//修改
//	2001/12/5 by Roger Lo,Created
function __grdGetFirstTR(iPgIdx,sTblName) {
	if (sTblName==null) sTblName=__grdGetTblName();
	var oTB=document.getElementById(sTblName+'gssTbl_'+iPgIdx);
	if (oTB==null) return null;
	for (var j=0;j<oTB.rows.length;j++) {			
		if (oTB.rows[j].__grdFLAG!='T' && oTB.rows[j].__grdFLAG!='H' && oTB.rows[j].__grdFLAG!='N') {
			return oTB.rows[j];
		}
	}
	return null;
}


//函數名稱: __grdGetLastTR()
//功能: 取得某頁表格的最後一筆TR
//備註: 
//參數說明:
//	iPgIdx:(integer)頁次
//	sTblName:(String,Optional)TableClass的Name屬性,多表格時要指定
//修改
//	2001/10/17 by Roger Lo,避開Title
function __grdGetLastTR(iPgIdx,sTblName) {
	if (sTblName==null) sTblName=__grdGetTblName();
	var oTB=document.getElementById(sTblName+'gssTbl_'+iPgIdx);
	if (oTB==null) return null;
	for (var j=oTB.rows.length-1;j>=0;j--) {			
		if (oTB.rows[j].__grdFLAG!='T' && oTB.rows[j].__grdFLAG!='H' && oTB.rows[j].__grdFLAG!='N') {
			return oTB.rows[j];
		}
	}
	return null;
}


//函數名稱: __grdGetTableRows()
//功能: 傳回指定表格的所有TR物件
//回傳值: Array()物件,元素為TR物件
//參數說明:
//	sTblName:(String,Optional)TableClass的Name屬性,多表格時要指定
function __grdGetTableRows(sTblName) {
	var aryTR=new Array();	
	if (sTblName==null) sTblName=__grdGetTblName();
	__grdASPGridInit(sTblName);	
	var oTB;
	var idx=0;
	var oDiv=document.getElementById(sTblName+"_divGrdBody");
	if (oDiv!=null) {
		oTB=oDiv.getElementsByTagName("TABLE")[0];		
		for (var j=0;j<oTB.rows.length;j++) {			
			if (oTB.rows[j].__grdFLAG!='T' && oTB.rows[j].__grdFLAG!='H' && oTB.rows[j].__grdFLAG!='N') {
				aryTR[idx]=oTB.rows[j];
				idx++;
			}
		}		
		return aryTR;
	} else {
		for (var i=__grdGetStartPage();i<=__grdGetTtlPages();i++) {
			oTB=document.getElementById(sTblName+"gssTbl_"+i);
			if (oTB!=null) {
				for (var j=0;j<oTB.rows.length;j++) {			
					if (oTB.rows[j].__grdFLAG!='T' && oTB.rows[j].__grdFLAG!='H' && oTB.rows[j].__grdFLAG!='N') {
						aryTR[idx]=oTB.rows[j];
						idx++;}
				}
			}
		}	
		return aryTR;
	}
}


//函數名稱: __grdGetDataToSave()
//功能: 在Client端編輯時,Client端呼叫此函數傳回曾經新增/修改/刪除的資料(XML格式)
//備註: 在多表格時,先呼叫 __grdASPGridInit(TableName)函數,起訖頁才不容易亂掉
//參數說明:
//	sGrdName:(String,Optional)TableClass的Name屬性,多表格時要指定
//	iPgS:(Integer,Optional)起始頁碼
//	iPgE:(Integer,Optional)結束頁碼
//	fWrap:(Boolean)所有列資料最後用<rows>作為根元件包裹起來
function __grdGetDataToSave(sGrdName,iPgS,iPgE,fWrap) {
	if (sGrdName==null) sGrdName=__mtblName;
	if (iPgS==null) iPgS=__mstartPage;
	if (iPgE==null) iPgE=__mendPage;			
	if (fWrap==null) fWrap=true;	
	var sSaveData=__grdGetNewDataToSave(sGrdName,iPgS,iPgE,false);
	sSaveData=sSaveData.concat(__grdGetModDataToSave(sGrdName,iPgS,iPgE,false));
	sSaveData=sSaveData.concat(__grdGetDelDataToSave(sGrdName,iPgS,iPgE,false));
	if (fWrap) {return '<rows _tblname="' + sGrdName + '">\n' + sSaveData + '</rows>\n'} 
	else {return sSaveData}
}

//函數名稱: __grdGetNewDataToSave()
//功能: 在Client端編輯時,Client端呼叫此函數傳回曾經新增的資料(XML格式)
//備註: 在多表格時,先呼叫 __grdASPGridInit(TableName)函數,起訖頁才不容易亂掉
//參數說明:
//	sGrdName:(String,Optional)TableClass的Name屬性,多表格時要指定
//	iPgS:(Integer,Optional)起始頁碼
//	iPgE:(Integer,Optional)結束頁碼
//	fWrap:(Boolean)所有列資料最後用<rows>作為根元件包裹起來
//修正:
//  2002/1/4 by Roger Lo,更改__grdASPGridInit()敘述位置
//	2001/12/4 by Roger Lo,增加__grdASPGridInit(sGrdName)敘述
//	2001/11/8 by Roger Lo,改用getElementById()
//	2001/10/9 by Roger Lo,for scroll table
function __grdGetNewDataToSave(sGrdName,iPgS,iPgE,fWrap) {
	if (sGrdName==null) sGrdName=__mtblName;
	__grdASPGridInit(sGrdName);
	if (iPgS==null) iPgS=__mstartPage;
	if (iPgE==null) iPgE=__mendPage;
	if (fWrap==null) fWrap=true;	
	var sData='';
	for (var i=iPgS;i<=iPgE;i++) {
		var oTB=document.getElementById(sGrdName+'gssTbl_'+i);
		//var oTB=eval('document.all.'+sGrdName+'gssTbl_'+i);
		if (oTB==null) {
			var oDiv=document.getElementById(sGrdName +  '_divGrdBody');
			//var oDiv=eval('document.all.' + sGrdName +  '_divGrdBody');
			oTB=oDiv.all.tags('TABLE')[0];			
		}						
		if (oTB!=null) {
			for (var j=1;j<oTB.rows.length;j++) {
				var oTR=oTB.rows[j];
				if (oTR.__grdFLAG=='2') {					
					sData+='  <row _type="new" _key="">'+__grdWrapDataByTR(oTR)+'</row>\n';
				}
			}
		}
	}
	if (fWrap) {return '<rows _tblname="' + sGrdName + '">\n' + sData + '</rows>\n';}
	else {return sData}
}

//函數名稱: __grdGetDelDataToSave()
//功能: 在Client端編輯時,Client端呼叫此函數傳回曾經刪除的資料(XML格式)
//備註: 在多表格時,先呼叫 __grdASPGridInit(TableName)函數,起訖頁才不容易亂掉
//參數說明:
//	sGrdName:(String,Optional)TableClass的Name屬性,多表格時要指定
//	iPgS:(Integer,Optional)起始頁碼
//	iPgE:(Integer,Optional)結束頁碼
//	fWrap:(Boolean)所有列資料最後用<rows>作為根元件包裹起來
//修改
//  2002/1/4 by Roger Lo,更改__grdASPGridInit()敘述位置
//	2001/12/4 by Roger Lo,增加__grdASPGridInit(sGrdName)敘述
//	2001/11/8 by Roger Lo,改用getElementById()
function __grdGetDelDataToSave(sGrdName,iPgS,iPgE,fWrap) {
	if (sGrdName==null) sGrdName=__mtblName;
	__grdASPGridInit(sGrdName);
	if (iPgS==null) iPgS=__mstartPage;
	if (iPgE==null) iPgE=__mendPage;
	if (fWrap==null) fWrap=true;	
	var oDel=document.getElementById(sGrdName+'__grdDELDATA');
	if (fWrap){return '<rows _tblname="' + sGrdName + '">\n'+ oDel.value + '</rows>\n';}
	else {return oDel.value}
}

//函數名稱: __grdGetModDataToSave()
//功能: 在Client端編輯時,Client端呼叫此函數傳回曾經修改的資料(XML格式)
//備註: 在多表格時,先呼叫 __grdASPGridInit(TableName)函數,起訖頁才不容易亂掉
//參數說明:
//	sGrdName:(String,Optional)TableClass的Name屬性,多表格時要指定
//	iPgS:(Integer,Optional)起始頁碼
//	iPgE:(Integer,Optional)結束頁碼
//	fWrap:(Boolean)所有列資料最後用<rows>作為根元件包裹起來
//修正:
//  2002/1/4 by Roger Lo,更改__grdASPGridInit()敘述位置
//	2001/12/4 by Roger Lo,增加__grdASPGridInit(sGrdName)敘述
//	2001/11/8 by Roger Lo,改用getElementById()
//	2001/10/9 by Roger Lo,for scroll table
function __grdGetModDataToSave(sGrdName,iPgS,iPgE,fWrap) {
	if (sGrdName==null) sGrdName=__mtblName;
	__grdASPGridInit(sGrdName);
	if (iPgS==null) iPgS=__mstartPage;
	if (iPgE==null) iPgE=__mendPage;	
	if (fWrap==null) fWrap=true;	
	var sData='';
	for (var i=iPgS;i<=iPgE;i++) {
		var oTB=document.getElementById(sGrdName+'gssTbl_'+i);
		if (oTB==null) {
			var oDiv=document.getElementById(sGrdName+'_divGrdBody');
			oTB=oDiv.all.tags('TABLE')[0];			
		}				
		if (oTB!=null) {
			for (var j=0;j<oTB.rows.length;j++) {
				var oTR=oTB.rows[j];
				if (oTR.__grdFLAG=='1') {					
					sData+='  <row _type="mod" _key="' + __grdGetKeyValByTR(oTR) + '">' + __grdWrapDataByTR(oTR)+'</row>\n';
				}
			}
		}
	}
	if (fWrap) {return '<rows _tblname="' + sGrdName + '">\n'+ sData + '</rows>\n';}
	else {return sData}
}

//函數名稱: __grdGetOnTableData()
//功能: 在Client端編輯時,Client端呼叫此函數傳回目前表格的所有資料(XML格式)
//備註: 在多表格時,先呼叫 __grdASPGridInit(TableName)函數,起訖頁才不容易亂掉
//參數說明:
//	sGrdName:(String,Optional)TableClass的Name屬性,多表格時要指定
//	iPgS:(Integer,Optional)起始頁碼
//	iPgE:(Integer,Optional)結束頁碼
//	fWrap:(Boolean)所有列資料最後用<rows>作為根元件包裹起來
//修正:
//  2002/1/4 by Roger Lo,更改__grdASPGridInit()敘述位置
//	2001/12/4 by Roger Lo,增加__grdASPGridInit(sGrdName)敘述
//  2001/11/29 by Roger Lo,忘了加Key值
//	2001/11/8 by Roger Lo,改用getElementById()
//	2001/10/17 by Roger Lo,避開title,note列
//	2001/10/15 by Roger Lo,for scroll table
//	2001/10/9 by Roger Lo,for scroll table
function __grdGetOnTableData(sGrdName,iPgS,iPgE,fWrap) {
	if (sGrdName==null) sGrdName=__mtblName;
	__grdASPGridInit(sGrdName);
	if (iPgS==null) iPgS=__mstartPage;
	if (iPgE==null) iPgE=__mendPage;	
	if (fWrap==null) fWrap=true;		
	var sData='';
	for (var i=iPgS;i<=iPgE;i++) {
		var oTB=document.getElementById(sGrdName+'gssTbl_'+i);
		if (oTB==null) {
			var oDiv=document.getElementById(sGrdName+'_divGrdBody');
			oTB=oDiv.all.tags('TABLE')[0];			
		}		
		if (oTB!=null) {
			for (var j=0;j<oTB.rows.length;j++) {
				var oTR=oTB.rows[j];
				if (oTR.__grdFLAG!='H' && oTR.__grdFLAG!='T' && oTR.__grdFLAG!='N') {
					sData+='  <row _type="ontable" _key="' + __grdGetKeyValByTR(oTR) + '">' + __grdWrapDataByTR(oTR)+'</row>\n';
				}
			}		
		}
	}
	if (fWrap) {return '<rows _tblname="' + sGrdName + '">\n'+ sData + '</rows>\n';}
	else {return sData}
}


//函數名稱: __grdGetCaptionOnSortString()
//功能: 取得點選標題時新的排序字串
//備註: 不能直接呼叫,必須由TD或其內的物件的事件驅動才行
//參數說明:
//	sDataType:(String,Optional)指定排序的資料類型
function __grdGetCaptionOnSortString(sDataType) {
	var sColID=__grdGetColID();
	var sOldSort=__grdGetSortString();
	var sNewSort='';
	if (sDataType==null) sDataType='';
	if (sOldSort.indexOf(',')>0){
		sNewSort=sColID + ' ' + sDataType;
	} else {
		if (sOldSort.indexOf(sColID+' ')<0) { //排序不同欄位切換	
			sNewSort=sColID + ' ' + 'ASC' + ' ' + sDataType;
		} else if (sOldSort==sColID) {	//同一欄位切換升降冪	1
			sNewSort=sColID + ' ' + 'DESC' + ' ' + sDataType; 
		} else { //同一欄位切換升降冪2
			sOldSort=sOldSort.toUpperCase();
			if (sOldSort.indexOf(' ASC')>0) {
				sNewSort=sColID + ' ' + 'DESC' + ' ' + sDataType;
			} else if (sOldSort.indexOf(' DESC')>0) {
				sNewSort=sColID + ' ' + 'ASC' + ' ' + sDataType;
			} else {
				sNewSort=sColID + ' ' + 'DESC' + sDataType;
			}
		}
	}	 
	return sNewSort;
}

//函數名稱: __grdGetSortString()
//功能: 取得目前表格的排序設定
//備註: 
//參數說明:無
//修改
//	2001/11/8 改用getElementById()
function __grdGetSortString() {
	try {
		var oDiv=document.getElementById(__mtblName+'_divGrd');
		return oDiv._grdSort;
	} catch(err) {return '';}
}

//函數名稱: __grdGetColID()
//功能: 取得目前點選欄位的欄位名稱(ID)
//備註: 不能直接呼叫,必須由TD或其內的物件的事件驅動才行
//參數說明:
//	e:選擇性,TD物件
function __grdGetColID(e) {
	if (e==null) {e=event.srcElement;}
	var oTH=__grdGetParentElementByTag(e,'TD');	
	var sCID='';
	if (oTH==null) return;
	if (oTH.id!='') {
		var sCID=oTH.id;
		var posS=__mtblName.length;
		var posE=sCID.lastIndexOf('_');
		sCID=sCID.substring(posS,posE)
	} else {
		sCID=oTH.__grdCID;
	}
	return sCID;
}

//函數名稱: __grdAdjustTblHeader()
//功能: 調整表格標題(Header)欄位與資料欄位的寬度,使其大小一致.
//備註: 可在表格標題區塊與表格資料區塊載入完成後呼叫此函數
//參數說明:
// oDivH:(div 物件)包住表格標題的區塊
// oDivB:(div 物件)包住表格資料的區塊
//修改:
//	2001/10/8 by Roger Lo,寫法改變
//	2001/10/4 by Roger Lo,階層式標題
function __grdAdjustTblHeader(oDivH,oDivB) {
	var oTBH=oDivH.all.tags('TABLE')[0];
	var oTBB=oDivB.all.tags('TABLE')[0];
	var oTRB=oTBB.rows[0];
	if (oTRB==null) return;		
	oDivH.style.overflow='hidden'; 
	oDivB.style.overflow='scroll';
	oTBH.align='left'; oTBB.align='left';
	oTBH.style.left='0';oTBB.style.left='0';
	
	//找最標題區與資料區的寬度差
	var iDeltaTB=__grdGetDeltaWidth(oDivB,oTBB);
	
	//找欄位最大寬度
	var oTDB,oTDH,sColID='';
	var aryW = new Array(oTRB.cells.length);
	var aryTDH = new Array(oTRB.cells.length);	
	oTBB.style.width='100%';	oTBH.style.width='100%';
	for (var i=0;i<oTRB.cells.length;i++) {
		oTDB=oTRB.cells[i];		
		aryW[i]=oTDB.offsetWidth;
		sColID=__grdGetTDColID(oTRB.cells[i].id);
		oTDH=__grdGetDivHTDByColID(oTBH,sColID);
		aryW[i]= (oTDH.offsetWidth>aryW[i])?oTDH.offsetWidth:aryW[i];
		aryTDH[i]=oTDH;
	}		
	
	var iDeltaTD=0;
	oTBB.style.pixelWidth=oTBB.offsetWidth;
	for (var i=0;i<oTRB.cells.length;i++) {		
		oTDH=oTRB.cells[i];
		iDeltaTD=aryW[i]-oTDH.offsetWidth;
		oTBB.style.pixelWidth+=iDeltaTD;
		oTDH.style.pixelWidth=aryW[i];
	}
	
	oTBH.style.pixelWidth=0;
	for (var i=0;i<oTRB.cells.length;i++) {
		oTDB=oTRB.cells[i];
		oTBH.style.pixelWidth+=oTDB.offsetWidth;
		aryTDH[i].style.pixelWidth=oTDB.offsetWidth;
		if (i==oTRB.cells.length-1) {
			aryTDH[i].style.pixelWidth+=iDeltaTB;
			oTBH.style.pixelWidth+=iDeltaTB;
		}		
	}		
}


function __grdGetDeltaWidth(oDivB,oTBB) {
//取得標題區與資料區的寬度差
	var newDiv=document.createElement("DIV");
	//alert('hi');
	//newDiv=oTBB.insertAdjacentElement("beforeBegin",newDiv);
	newDiv=oDivB.insertAdjacentElement("afterBegin",newDiv);
	newDiv.style.width='100%';
	//newDiv.style.border='1 black solid';
	//newDiv.style.backgroundColor='blue';
	var iDelta=oDivB.offsetWidth-newDiv.offsetWidth;
	newDiv.removeNode(true);
	return iDelta;	
}



function __grdGetDivHTDByColID(oTB,sColID) {
//從標題區塊內的表格取出作為欄位標題的TD物件(為了階層式標題)
//新增: 2001/10/4
	for (var i=0;i<oTB.rows.length;i++) {
		var oTR=oTB.rows[i];
		if (oTR.__grdFLAG=='H') {
			for (var j=0;j<oTR.cells.length;j++) {
				if (oTR.cells[j].__grdCID==sColID) { return oTR.cells[j] }					
			}	
		}
	}	
}


//函數名稱: __grdScrollTblHeader()
//功能: 捲動(Scroll)表格資料的區塊時,調整表格標題的區塊的位置,使其對齊.
//備註: 可利用資料區塊(div)的OnScroll事件來呼叫此函數
//參數說明:
// oDivH:(div 物件)包住表格標題的區塊
// oDivB:(div 物件)包住表格資料的區塊
function __grdScrollTblHeader(oDivH,oDivB) {
	oDivH.scrollLeft=oDivB.scrollLeft;
}   